#pragma once

#include <arpa/inet.h>
#include <iostream>
#include <vector>
#include <optional>
namespace util::ip_helper
{
typedef struct SRouteInfo
{
    std::string Iface;
    std::string DstIp;
    int         Mask;
    std::string NextIp;
} SRouteInfo;

bool        IsValidIPv4(const std::string& ip);
uint32_t    IPToUint(const std::string& ipStr);
void        GetRoutes(std::vector<SRouteInfo>& routes, std::string& defaultGateway);
bool        is_ip_in_subnet(const std::string& ip, const std::string& subnet);
bool        are_all_ips_in_whitelist(const std::vector<std::string>& ip, const std::vector<std::string>& WhiteLists);
bool        is_ip_in_whitelist(const std::string& ip, const std::vector<std::string>& WhiteLists);
std::string GetSegment(const std::string& ip, int mask);
std::string GetBoardcast(const std::string& ip, int mask);
//判断子网掩码是否合法并获取位数,失败返回null
std::optional<int> GetMaskNum(const std::string& netmaskStr);
/**
 * 查询所有网口是否存在同网段的IP
 * @param ipStr 要查找同网段的IP/网段地址
 * @param netmaskStr 传入IP格式的子网掩码，为空则表示网段地址，否则为具体IP地址
 * @param skipName 接口名称，查找函数会跳过此接口
 * @return 找到则返回该接口名称，否则返回null
 */
std::string FindSegment(const std::string& ipStr, const std::string& netmaskStr = "", const std::string& skipName = "");
}  // namespace util::ip_helper